package com.shujia.wyh.moniqiefen2;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;

/*
    这个类用于产生block块的，读取数据行数，假设一行数据是1M，读取140行相当于读取了140M数据，触发产生block的逻辑，将128M的数据保存到一个block块中

 */
public class CreateBlockDemo {
    public static void main(String[] args) throws Exception {
        //将外部数据读取进来
        //创建一个字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("hadoop/data/students.txt"));

        

        //将来产生的block块，看作是一个文件，block-0...
        //创建一个索引，表示目前是第几个block块
        int index = 0;
        //创建一个字符串缓冲输出流对象，目的就是写一个block块
        BufferedWriter bw = new BufferedWriter(new FileWriter("hadoop/src/main/java/com/shujia/wyh/moniqiefen2/blocks/block-" + index));
        //假设现在一行数据是1M，每128M产生一个block块，向一个block-index的文件中写数据，最后剩余的行数不到128M也会产生一个block块文件
        //每次读取到128M*1.1（140M）的大小的时候，会触发生成一个block块，将前面读取到的140行数据中的前128行写入到block块，前面读取剩余的12行计入到下一个block块中存储
        //创建一个集合，用于存储每次读取到的数据
        ArrayList<String> rows = new ArrayList<>();

        //定义一个变量，表示每次写block块的开始位置
        int offset = 0;

        //定义一个变量，记录当前已经读取了多少行
        int rowNum = 0;

        //遍历文件读取数据
        String line = null;
        while ((line = br.readLine()) != null) {
            //读取的行数+1
            rowNum++;
            //将读取到数据添加到集合中
            rows.add(line);

            //当我们读取的数据量达到140的时候，就会出发逻辑产生block块，将前面读取到的140行中的前128行写入到一个block块文件中，剩下的12行作为下一次计数的开始
            if (rowNum == 140) {
                offset = 128 * index;
                //遍历集合，从开始位置索引取数据，放到block块中
                //又因为我们是List集合，可以使用索引的方式取数据
                //从开始位置循环取128次
                for (int i = offset; i < offset + 128; i++) {
                    //通过索引取出每一行
                    String row = rows.get(i);
                    bw.write(row);
                    bw.newLine();
                    bw.flush();
                }
                rowNum = 12;
                index++;
                bw = new BufferedWriter(new FileWriter("hadoop/src/main/java/com/shujia/wyh/moniqiefen2/blocks/block-" + index));
            }
        }

        //有可能还有剩余的数据没有写到block块中，将剩余的数据也写入到block块中
        for(int i=rows.size()-rowNum;i<rows.size();i++){
            String row = rows.get(i);
            bw.write(row);
            bw.newLine();
            bw.flush();
        }

        System.out.println("所有block块产生完毕！！");

        //释放资源
        bw.close();
        br.close();



    }
}

























